package {{basePackage}}

import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

import io.swagger.v3.oas.models.OpenAPI
import io.swagger.v3.oas.models.info.Info
import io.swagger.v3.oas.models.info.Contact
import io.swagger.v3.oas.models.info.License
import io.swagger.v3.oas.models.Components
import io.swagger.v3.oas.models.security.SecurityScheme

@Configuration
class SpringDocConfiguration {

    @Bean
    fun apiInfo(): OpenAPI {
        return OpenAPI()
            .info(
                Info(){{#appName}}
                    .title("{{appName}}"){{/appName}}
                    .description("{{{appDescription}}}"){{#termsOfService}}
                    .termsOfService("{{termsOfService}}"){{/termsOfService}}{{#openAPI}}{{#info}}{{#contact}}
                    .contact(
                        Contact(){{#infoName}}
                            .name("{{infoName}}"){{/infoName}}{{#infoUrl}}
                            .url("{{infoUrl}}"){{/infoUrl}}{{#infoEmail}}
                            .email("{{infoEmail}}"){{/infoEmail}}
                    ){{/contact}}{{#license}}
                    .license(
                        License()
                            {{#licenseInfo}}.name("{{licenseInfo}}")
                            {{/licenseInfo}}{{#licenseUrl}}.url("{{licenseUrl}}")
                            {{/licenseUrl}}
                    ){{/license}}{{/info}}{{/openAPI}}
                    .version("{{appVersion}}")
            ){{#hasAuthMethods}}
            .components(
                Components(){{#authMethods}}
                    .addSecuritySchemes("{{name}}", SecurityScheme(){{#isBasic}}
                        .type(SecurityScheme.Type.HTTP)
                        .scheme("{{scheme}}"){{#bearerFormat}}
                        .bearerFormat("{{bearerFormat}}"){{/bearerFormat}}{{/isBasic}}{{#isApiKey}}
                        .type(SecurityScheme.Type.APIKEY){{#isKeyInHeader}}
                        .`in`(SecurityScheme.In.HEADER){{/isKeyInHeader}}{{#isKeyInQuery}}
                        .`in`(SecurityScheme.In.QUERY){{/isKeyInQuery}}{{#isKeyInCookie}}
                        .`in`(SecurityScheme.In.COOKIE){{/isKeyInCookie}}
                        .name("{{keyParamName}}"){{/isApiKey}}{{#isOAuth}}
                        .type(SecurityScheme.Type.OAUTH2){{/isOAuth}}
                    ){{/authMethods}}
            ){{/hasAuthMethods}}
    }
}
